/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.Nacionalidade;
import br.com.foxinline.enums.TipoProfissional;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Equipe;
import br.com.foxinline.modelo.MicroArea;
import br.com.foxinline.modelo.Profissional;
import br.com.foxinline.modelo.Unidade;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.EnderecoServico;
import br.com.foxinline.servico.EquipeServico;
import br.com.foxinline.servico.MicroAreaServico;
import br.com.foxinline.servico.ProfissionalServico;
import br.com.foxinline.servico.UnidadeServico;
import br.com.foxinline.utilitario.Caracter;
import br.com.foxinline.utilitario.Msg;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author ely
 */
@ManagedBean
@ViewScoped
public class ManagerCriarEquipe {

    @EJB
    EquipeServico equipeServico;
    @EJB
    ProfissionalServico profissionalServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    UnidadeServico unidadeServico;
    @EJB
    MicroAreaServico microAreaServico;
    
    private Equipe equipe;
    private Profissional profissionalPesquisar;
    private List<Profissional> profissionaisPesquisar;
    private Profissional profissionalSelecionado;
    private List<Profissional> profissionaisSelecionados;
    private Profissional profissionalCadastrar;
    private Profissional profissionalRemover;
    private boolean disableEnderecoImovel;
    private boolean mensagemCep;

    @PostConstruct
    public void init() {
        profissionalPesquisar = new Profissional();
        equipe = new Equipe();
        profissionaisPesquisar = new ArrayList<Profissional>();
        profissionalSelecionado = new Profissional();
        profissionaisSelecionados = new ArrayList<Profissional>();
        profissionalCadastrar = new Profissional();
        profissionalCadastrar.setEndereco(new Endereco());
        profissionalCadastrar.getEndereco().setBairro(new Bairro());
        profissionalRemover = new Profissional();
    }

    public void salvar() {
        try {

            equipe.setProfissionais(profissionaisSelecionados);
            equipeServico.salvar(equipe);

            for (Profissional p : profissionaisSelecionados) {
                p.setEquipe(equipe);
                profissionalServico.atualizar(p);
            }
            Msg.messagemInfo(Msg.SuccessFull);
            init();
        } catch (Exception erro) {
            erro.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<Unidade> todasUnidades() {
        return unidadeServico.pesquisarTodos();
    }

    public List<MicroArea> todasMicroArea() {
        return microAreaServico.pesquisarTodos();
    }

    public void selecionarProfissional() {
        this.profissionaisSelecionados.add(this.profissionalSelecionado);
//        profissionaisPesquisar = new ArrayList<Profissional>();
    }

    public void setRemoverProfissional(Profissional prof) {
        this.profissionalRemover = prof;
    }

    public void removerProfissional() {
        profissionaisSelecionados.remove(profissionalRemover);
    }

    public void pesquisarProfissional() {
        profissionaisPesquisar = profissionalServico.findProfissional(profissionalPesquisar);
    }

    public void instanciarProfissional() {
        profissionalCadastrar = new Profissional();
        profissionalCadastrar.setEndereco(new Endereco());
        profissionalCadastrar.getEndereco().setBairro(new Bairro());
    }

    public void existeEndereco() {
        Endereco endereco;

        endereco = enderecoServico.existCep(profissionalCadastrar.getEndereco());

        if (endereco != null) {
            profissionalCadastrar.setEndereco(endereco);
            disableEnderecoImovel = true;
            mensagemCep = false;
        } else {
            mensagemCep = true;
            disableEnderecoImovel = false;
        }
    }

    public void salvarProfissional() {
        Bairro bairro;
        try {
            profissionalCadastrar.setCpf(Caracter.removecaracter(profissionalCadastrar.getCpf()));
            profissionalCadastrar.getEndereco().setCep(Caracter.removecaracter(profissionalCadastrar.getEndereco().getCep()));

            bairro = bairroServico.findBairro(profissionalCadastrar.getEndereco().getBairro().getNome());
            if (bairro.getId() == null) {
                bairroServico.salvar(profissionalCadastrar.getEndereco().getBairro());
                profissionalCadastrar.getEndereco().setBairro(bairro);
            } else {
                profissionalCadastrar.getEndereco().setBairro(bairro);
            }


            if (profissionalCadastrar.getTipoProfissional() != TipoProfissional.AGENTE_SAUDE) {
                profissionalCadastrar.setMicroArea(null);
            }


            profissionalServico.salvar(profissionalCadastrar);
            Msg.messagemInfo(Msg.SuccessFull);
            this.profissionaisSelecionados.add(this.profissionalCadastrar);
//
//            
//            
            profissionalCadastrar = new Profissional();
            profissionalCadastrar.setEndereco(new Endereco());
            profissionalCadastrar.getEndereco().setBairro(new Bairro());


            RequestContext requestContext = RequestContext.getCurrentInstance();
            requestContext.execute("dialogProfissional.hide()");

        } catch (Exception erro) {
        }
    }

    public List<SelectItem> tipoProfissional() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoProfissional tipo : TipoProfissional.values()) {
            items.add(new SelectItem(tipo, tipo.getName()));
        }
        return items;
    }

    public List<SelectItem> nacionalidade() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (Nacionalidade tipo : Nacionalidade.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public Equipe getEquipe() {
        return equipe;
    }

    public void setEquipe(Equipe equipe) {
        this.equipe = equipe;
    }

    public Profissional getProfissionalPesquisar() {
        return profissionalPesquisar;
    }

    public void setProfissionalPesquisar(Profissional profissionalPesquisar) {
        this.profissionalPesquisar = profissionalPesquisar;
    }

    public List<Profissional> getProfissionaisPesquisar() {
        return profissionaisPesquisar;
    }

    public void setProfissionaisPesquisar(List<Profissional> profissionaisPesquisar) {
        this.profissionaisPesquisar = profissionaisPesquisar;
    }

    public Profissional getProfissionalSelecionado() {
        return profissionalSelecionado;
    }

    public void setProfissionalSelecionado(Profissional profissionalSelecionado) {
        this.profissionalSelecionado = profissionalSelecionado;
    }

    public List<Profissional> getProfissionaisSelecionados() {
        return profissionaisSelecionados;
    }

    public void setProfissionaisSelecionados(List<Profissional> profissionaisSelecionados) {
        this.profissionaisSelecionados = profissionaisSelecionados;
    }

    public Profissional getProfissionalCadastrar() {
        return profissionalCadastrar;
    }

    public void setProfissionalCadastrar(Profissional profissionalCadastrar) {
        this.profissionalCadastrar = profissionalCadastrar;
    }

    public boolean isDisableEnderecoImovel() {
        return disableEnderecoImovel;
    }

    public void setDisableEnderecoImovel(boolean disableEnderecoImovel) {
        this.disableEnderecoImovel = disableEnderecoImovel;
    }

    public boolean isMensagemCep() {
        return mensagemCep;
    }

    public void setMensagemCep(boolean mensagemCep) {
        this.mensagemCep = mensagemCep;
    }
}
